package com.fiap.gestaoPassagens.endereco;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;
import org.apache.commons.lang3.StringUtils;
import com.fiap.gestaoPassagens.dao.ConnectionFactory;


public class EnderecoDao {
	
	public List<EstadoBean> listEstados(EstadoBean estadoBean) throws SQLException {
		Connection con = ConnectionFactory.getConnection();
		PreparedStatement pstmt = null;
		StringBuffer sql = new StringBuffer();
		ResultSet rs = null;
		List<EstadoBean> lista = new ArrayList<EstadoBean>();

		try {
			sql.append(" SELECT id_estado,sigla, nome nm_estado FROM  db_fiap.ESTADO ");
			sql.append(" WHERE 1=1 ");
			
			if (estadoBean.getId()>0) {
				sql.append(" AND id_estado = ? ");
			}

			if (StringUtils.trimToNull(estadoBean.getSigla())!=null) {
				sql.append(" AND sigla = ? ");
			}			
			
			sql.append(" ORDER BY sigla ");

			pstmt = con.prepareStatement(sql.toString());

			if (estadoBean.getId()>0) {
				pstmt.setLong(1, estadoBean.getId());
			}

			if (StringUtils.trimToNull(estadoBean.getSigla())!=null) {
				pstmt.setString(2, estadoBean.getSigla());
			}			

			rs = pstmt.executeQuery();

			while (rs.next()) {
				lista.add(this.mountEstado(rs));
			}

		} catch (Exception ex) {
			ex.printStackTrace();
		} finally {
			pstmt.close();
			con.close();
			rs.close();
		}
		return lista;
	}
	
	public List<CidadeBean> listCidades(CidadeBean cidadeBean) throws SQLException {
		Connection con = ConnectionFactory.getConnection();
		PreparedStatement pstmt = null;
		StringBuffer sql = new StringBuffer();
		ResultSet rs = null;
		List<CidadeBean> lista = new ArrayList<CidadeBean>();

		try {
			sql.append(" SELECT id_cidade, nome nm_cidade FROM  db_fiap.CIDADE ");
			sql.append(" WHERE 1=1 ");
			
			if (cidadeBean.getId()>0) {
				sql.append(" AND id_cidade = ? ");
			}

			if (cidadeBean.getIdEstado()>0) {
				sql.append(" AND id_estado = ? ");
			}			
			
			sql.append(" ORDER BY nome ");

			pstmt = con.prepareStatement(sql.toString());

			if (cidadeBean.getId()>0) {
				pstmt.setLong(1, cidadeBean.getId());
			}

			if (cidadeBean.getIdEstado()>0) {
				pstmt.setLong(2, cidadeBean.getIdEstado());
			}

			rs = pstmt.executeQuery();

			while (rs.next()) {
				lista.add(this.mountCidade(rs));
			}

		} catch (Exception ex) {
			ex.printStackTrace();
		} finally {
			pstmt.close();
			con.close();
			rs.close();
		}
		return lista;
	}	
	

	public EnderecoBean getEndereco(EnderecoBean enderecoBean) throws SQLException {
		Connection con = ConnectionFactory.getConnection();
		PreparedStatement pstmt = null;
		StringBuffer sql = new StringBuffer();
		ResultSet rs = null;
		

		try {
			sql.append(" SELECT ");
			sql.append(" endereco.ID, ");
			sql.append(" endereco.LOGRADOURO, ");
			sql.append(" endereco.BAIRRO, ");
			sql.append(" endereco.ESTADO, ");
			sql.append(" endereco.CIDADE, ");
			sql.append(" endereco.COMPLEMENTO, ");
			sql.append(" endereco.CEP, ");
			sql.append(" endereco.ID_PESSOA ");
			sql.append(" FROM db_fiap.endereco ");
			sql.append(" where ID_PESSOA = ? ");




			pstmt = con.prepareStatement(sql.toString());

			pstmt.setLong(1, enderecoBean.getIdPessoa());			
			
			rs = pstmt.executeQuery();

			if (rs.next()) {
				return this.mountEndereco(rs);
			}

		} catch (Exception ex) {
			ex.printStackTrace();
		} finally {
			pstmt.close();
			con.close();
			rs.close();
		}
		return enderecoBean;
	}		
	
	public EstadoBean mountEstado(ResultSet rs) throws SQLException{
		EstadoBean estado = new EstadoBean();
		estado.setId(rs.getLong("ID_ESTADO"));
		estado.setSigla(rs.getString("SIGLA"));
		estado.setDescricao(rs.getString("nm_estado"));
		return estado;
	}
	
	public CidadeBean mountCidade(ResultSet rs) throws SQLException{
		CidadeBean cidade = new CidadeBean();
		cidade.setId(rs.getLong("ID_CIDADE"));
		cidade.setDescricao(rs.getString("nm_cidade"));
		return cidade;
	}
	
	public EnderecoBean mountEndereco(ResultSet rs) throws Exception{
		EnderecoBean endereco =   new EnderecoBean(new CidadeBean(),new EstadoBean());
		endereco.setId(rs.getLong("ID"));
		endereco.setIdPessoa(rs.getLong("ID_PESSOA"));
		endereco.setCep(rs.getString("CEP"));
		endereco.setLogradouro(rs.getString("LOGRADOURO"));
		endereco.setBairro(rs.getString("bairro"));
		endereco.setComplemento(rs.getString("COMPLEMENTO"));
		endereco.getCidade().setDescricao(rs.getString("CIDADE"));
		endereco.getEstado().setSigla(rs.getString("ESTADO"));
		return endereco;
	}
	
	public EnderecoBean create(EnderecoBean enderecoBean) throws SQLException {
		Connection con = ConnectionFactory.getConnection();
		PreparedStatement pstmt = null;
		StringBuffer sql = new StringBuffer();
		ResultSet rs;
		int i=0;

		try {
			sql.append(" INSERT INTO db_fiap.endereco ");
			sql.append(" (LOGRADOURO, ");
			sql.append(" BAIRRO, ");
			sql.append(" ESTADO, ");
			sql.append(" CIDADE, ");
			sql.append(" CEP, ");
			sql.append(" ID_PESSOA, ");
			sql.append(" COMPLEMENTO) ");
			sql.append(" VALUES(?,?,?,?,?,?,?) ");

			pstmt = con.prepareStatement(sql.toString(),Statement.RETURN_GENERATED_KEYS);

			pstmt.setString(++i, enderecoBean.getLogradouro());
			pstmt.setString(++i, enderecoBean.getBairro());
			pstmt.setString(++i, enderecoBean.getEstado().getSigla());
			pstmt.setString(++i, enderecoBean.getCidade().getDescricao());
			pstmt.setString(++i, enderecoBean.getCep());
			pstmt.setLong(++i, enderecoBean.getIdPessoa());
			pstmt.setString(++i, enderecoBean.getComplemento());

			pstmt.executeUpdate();
			
			//Retorna o ID gerado.
			rs=pstmt.getGeneratedKeys();
			if(rs.next()){
				enderecoBean.setId(rs.getLong(1));
			}

		} catch (Exception ex) {
			System.out.println(ex.getMessage());
		} finally {
			pstmt.close();
			con.close();
		}

		return enderecoBean;
	}	
	
	public EnderecoBean update(EnderecoBean enderecoBean) throws SQLException {
		Connection con = ConnectionFactory.getConnection();
		PreparedStatement pstmt = null;
		StringBuffer sql = new StringBuffer();
		ResultSet rs;
		int i=0;

		try {
			sql.append(" UPDATE db_fiap.endereco ");
			sql.append(" SET LOGRADOURO = ?, ");
			sql.append(" BAIRRO = ?, ");
			sql.append(" ESTADO = ?, ");
			sql.append(" CIDADE = ?, ");
			sql.append(" CEP = ?, ");
			sql.append(" ID_PESSOA = ?, ");
			sql.append(" COMPLEMENTO = ?) ");
			sql.append(" WHERE ID = ? ");

			pstmt = con.prepareStatement(sql.toString());

			pstmt.setString(++i, enderecoBean.getLogradouro());
			pstmt.setString(++i, enderecoBean.getBairro());
			pstmt.setString(++i, enderecoBean.getEstado().getSigla());
			pstmt.setString(++i, enderecoBean.getCidade().getDescricao());
			pstmt.setString(++i, enderecoBean.getCep());
			pstmt.setLong(++i, enderecoBean.getIdPessoa());
			pstmt.setString(++i, enderecoBean.getComplemento());
			pstmt.setLong(++i, enderecoBean.getId());

			pstmt.executeUpdate();
			
			//Retorna o ID gerado.
			rs=pstmt.getGeneratedKeys();
			if(rs.next()){
				enderecoBean.setId(rs.getLong(1));
			}

		} catch (Exception ex) {
			System.out.println(ex.getMessage());
		} finally {
			pstmt.close();
			con.close();
		}

		return enderecoBean;
	}		

}
